前言
本文对Android NDK开发进行较详细的梳理,特别是针对其中涉及到的坑进行重点阐述,以让大家在后续的开发中重复踩坑。
CMake
待续
ndk-build
待续
工程实施
待续
构建
构建命令
打开Android studio的内嵌终端;
在项目根目录下,执行形如
gradlew.bat [module_name]:externalNativeBuild[buildTypesName]
的命令,比如:gradlew.bat ndkbuild:externalNativeBuildRelease
其中,module_name为你的工程模块(module)名称,如果是app模块,这里则取“app”。buildTypesName是该模块的build.gradle配置里面的buildTypes(构建类型)中的其中一种,比如release或者你自己配置的名字。下面代码片段是截取自示例模块ndkbuild的build.gradle示例:
android { compileSdkVersion 26 lintOptions { disable 'OldTargetApi','UnusedResources' } defaultConfig { minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" externalNativeBuild { ndkBuild { //arguments "NDK_APPLICATION_MK:=src/main/jni/Application.mk" //cFlags "-DTEST_C_FLAG1", "-DTEST_C_FLAG2" //cppFlags "-DTEST_CPP_FLAG2", "-DTEST_CPP_FLAG2" abiFilters "armeabi-v7a" } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } externalNativeBuild { ndkBuild { path 'src/main/jni/projects/android/jni/Android.mk' } } }
构建命令执行完成之后,如果是采用ndk-build构建,在
%module_path%/build/intermediates/ndkBuild
,如果是采用cmake构建,则%module_path%/build/intermediates/cmake
下可查看构建的结果。其中%module_path%
代表module的全路径。则是示例如下图:从步骤3中查看构建出来的so往往比正常情况下大很多,这里原因暂未找到!!!不过可以在目录
%module_path%/build/outputs/aar
下面找到aar(前提是这里的module是android library module而非app module),用压缩软件打开,提取出压缩包中的jni子目录下的so,这里的so大小正常。
clean命令
想要清除上一次构建的结果,类似于构建命令,可按照如下步骤操作:
打开Android studio的内嵌终端;
分两种clean模式:
a.只针对性清理某一构建命令生成的文件,在项目根目录下执行形如
gradlew.bat [module_name]:externalNativeBuildClean[buildTypesName]
的命令,比如:gradlew.bat ndkbuild:externalNativeBuildCleanRelease
b.全清除,即清楚所有生成的构建文件和目录。即
%module_path%/build
目录全部删除。那么应该执行形如形如gradlew.bat [module_name]:clean
的命令,比如:gradlew.bat ndkbuild:clean
当然也直接利用Android studio的菜单栏中的选项(
Build-->Clean Project
)进行clean(不过这样是清理整个project),比如:
清理完成之后,如果项目是采用ndk-build构建,在
%module_path%/build/intermediates/ndkBuild
,如果是采用cmake构建,则%module_path%/build/intermediates/cmake
下可查看是否清理完成。如果是全清除模式,则查看%module_path%/build
目录是否删除。